/**
 * @Author: Jiang Zhongxun
 * @Date: 2025-02-18 21:41:07
 * @FilePath: \CAR_REG\Int\Int_TB6612.c
 * @Description: 电机驱动
 * @Copyright (c) 2025 by JiangZhongxun, All Rights Reserved.
 */
#include "Int_TB6612.h"

/**
 * @description: TB6612初始化
 * @param {*} 无参
 * @return {*} 无返回值
 */
void Int_TB6612_Init(void)
{
    // 1. 初始化定时器4
    Dri_TIM4_Init();

    // 2. 初始化GPIO：PB12、PB13、PB14、PB15，推挽输出，MODE=11，CNF=00
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    GPIOB->CRH |= (GPIO_CRH_MODE12 | GPIO_CRH_MODE13 | GPIO_CRH_MODE14 | GPIO_CRH_MODE15);
    GPIOB->CRH &= ~(GPIO_CRH_CNF12 | GPIO_CRH_CNF13 | GPIO_CRH_CNF14 | GPIO_CRH_CNF15);
}

/**
 * @description: 控制电机A的方向
 * @param {uint8_t} direct 期望的转动方向
 * @return {*} 无返回值
 */
void Int_TB6612_MotorA(uint8_t direct)
{
    /**
     * ? AIN1 ---> PB14，AIN2 ---> PB15
     * * 正转：AIN1=0，AIN2=1
     * * 反转：AIN1=1，AIN2=0
     * * 刹车：AIN1=1，AIN2=1
     * * 停止：AIN1=0，AIN2=0
     */
    if (direct == GO)
    {
        // 正转
        AIN1_L;
        AIN2_H;
    }
    else if (direct == BACK)
    {
        // 反转
        AIN1_H;
        AIN2_L;
    }
    else
    {
        // 刹车
        AIN1_H;
        AIN2_H;
    }
}

/**
 * @description: 控制电机B的方向
 * @param {uint8_t} direct 期望的转动方向
 * @return {*} 无返回值
 */
void Int_TB6612_MotorB(uint8_t direct)
{
    /**
     * ? BIN1 ---> PB13，BIN2 ---> PB12
     * * 正转：BIN1=0，BIN2=1
     * * 反转：BIN1=1，BIN2=0
     * * 刹车：BIN1=1，BIN2=1
     * * 停止：BIN1=0，BIN2=0
     */
    if (direct == GO)
    {
        // 正转
        BIN1_L;
        BIN2_H;
    }
    else if (direct == BACK)
    {
        // 反转
        BIN1_H;
        BIN2_L;
    }
    else
    {
        // 刹车
        BIN1_H;
        BIN2_H;
    }
}

/**
 * @description: 根据带符号的PWM值，设置电机的转速和方向
 * @param {int} pwma A电机，带符号
 * @param {int} pwmb B电机，带符号
 * @return {*} 无返回值
 */
void Int_TB6612_SetPWM(int pwma, int pwmb)
{
    /**
     * ? 根据带符号的PWM值：1. 设置方向，2. 设置PWM占空比
     * * PWMA ---> PB9 ---> TIM4_CH4
     * * PWMB ---> PB8 ---> TIM4_CH3
     */
    // 1. 处理pwma
    // 1.1 根据符号处理方向
    if (pwma > 0)
    {
        // 正转
        Int_TB6612_MotorA(GO);
    }
    else if (pwma < 0)
    {
        // 反转
        Int_TB6612_MotorA(BACK);
        // 为后续设置CCR做准备，负数取绝对值
        pwma = -pwma;
    }
    else
    {
        // 刹车
        Int_TB6612_MotorA(STOP);
    }
    // 1.2 设置对应的PWM值 ---> 对应定时器通道4的CCR值
    TIM4->CCR4 = pwma;

    // 2. 处理pwmb
    // 2.1 根据符号处理方向
    if (pwmb > 0)
    {
        // 正转
        Int_TB6612_MotorB(GO);
    }
    else if (pwmb < 0)
    {
        // 反转
        Int_TB6612_MotorB(BACK);
        // 为后续设置CCR做准备，负数取绝对值
        pwmb = -pwmb;
    }
    else
    {
        // 刹车
        Int_TB6612_MotorB(STOP);
    }
    // 2.2 设置对应的PWM值 ---> 对应定时器通道3的CCR值
    TIM4->CCR3 = pwmb;
}
